package utils.sl651;
import lombok.Data;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

/**
 * SL651协议报文数据模型
 * 
 * 表示解析后的报文结构和数据内容
 */
@Data
public class SL651Message {
    
    // 报文头部信息
    private String centerAddress;           // 中心站地址
    private String stationAddress;          // 遥测站地址
    private String password;                // 密码
    private String functionCode;            // 功能码
    private String flagAndLength;           // 标识符和长度
    private String serialNumber;            // 流水号
    private String reportTime;              // 发报时间
    private String crcCode;                 // CRC校验码
    
    // 解析状态
    private boolean isValid;                // 报文是否有效
    private boolean crcValid;               // CRC校验是否通过
    private String errorMessage;            // 错误信息
    
    // 数据内容
    private String rawData;                 // 原始数据部分
    private Map<String, String> dataElements; // 解析后的数据元素
    private LocalDateTime observeDateTime;   // 观测时间对象
    
    public SL651Message() {
        this.dataElements = new HashMap<>();
        this.isValid = false;
        this.crcValid = false;
    }

    /**
     * 添加数据元素
     */
    public void addDataElement(String key, String value) {
        this.dataElements.put(key, value);
    }
    
    /**
     * 获取数据元素值
     */
    public String getDataElement(String key) {
        return this.dataElements.get(key);
    }
    
    /**
     * 获取数据长度
     */
    public int getDataLength() {
        if (flagAndLength != null && flagAndLength.length() >= 4) {
            String lengthHex = flagAndLength.substring(1); // 去掉标识符，取后3位
            return Integer.parseInt(lengthHex, 16);
        }
        return 0;
    }

    /**
     * 转换为字符串表示
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("SL651Message{");
        sb.append("centerAddress='").append(centerAddress).append('\'');
        sb.append(", stationAddress='").append(stationAddress).append('\'');
        sb.append(", functionCode='").append(functionCode).append('\'');
        sb.append(", functionDesc='").append(SL651CommonUtil.getFunctionCodeDescription(this.functionCode)).append('\'');
        sb.append(", serialNumber='").append(serialNumber).append('\'');
        sb.append(", reportTime='").append(reportTime).append('\'');
        sb.append(", isValid=").append(isValid);
        sb.append(", crcValid=").append(crcValid);
        if (errorMessage != null) {
            sb.append(", errorMessage='").append(errorMessage).append('\'');
        }
        sb.append(", dataElements=").append(dataElements);
        sb.append('}');
        return sb.toString();
    }
}